package com.hmp.recruit.admin.sys.user.controller;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import com.hmp.recruit.admin.sys.user.service.UserService;
import com.hmp.recruit.admin.sys.user.vo.UserVo;
import com.hmp.recruit.common.util.config.AppProp;
import com.hmp.recruit.common.util.date.DateUtil;
import com.hmp.recruit.common.util.mail.MailInfo;
import com.hmp.recruit.common.util.mail.MailUtil;
import com.hmp.recruit.common.util.security.AESUtil;
import com.hmp.recruit.common.util.security.SessionUtil;
import com.hmp.recruit.common.util.validate.RegUtil;
import com.hmp.recruit.common.vo.AjaxResult;

@RequestMapping("/admin/sys/user")
@Controller
public class UserController {

	@Resource
	private UserService userService;

	@RequestMapping("/login")
	@ResponseBody
	public AjaxResult login(String email, String password, HttpSession session) {
		AjaxResult result = new AjaxResult();
		
		UserVo user = userService.login(email, password);
		if(user != null) {
			session.setAttribute("user", user);
			
			result.setSuccess(true);
			result.setMsg("登录成功！");
		} else {
			result.setSuccess(false);
			result.setMsg("账号或密码错误！");  // 这里不要判断太过于精确，比如说又判断用户名存在与否，又判断密码对否，这样会给系统增加安全隐患
		}
		
		return result;
	}

	/**
	 * 注册
	 * 
	 * @author 何家明
	 * @date 2018年11月17日 下午11:17:57
	 * @param account
	 * @param password
	 * @return
	 */
	@RequestMapping("/register")
	@ResponseBody
	public AjaxResult register(String email, String password) {
		AjaxResult result = new AjaxResult();
		if(RegUtil.isEmail(email)) {
			
			UserVo user = userService.getByEmail(email);
			if(user != null) {
				result.setSuccess(false);
				result.setMsg("此邮箱已被注册，请直接登录！");
			} else {
			
				userService.register(email, password);
				
				try {
					MailInfo mailInfo = new MailInfo();
					
					List<String> toList = new ArrayList<String>();
					toList.add(email);
					mailInfo.setToAddress(toList);// 收件人
					
					mailInfo.setSubject("账号注册验证");
					
					String siteAddressPre = AppProp.get("app.siteAddressPre") + "sys/user/validateEmail/";
					
					String urlParam = "email=" + email + "&validateTime=" + DateUtil.getNow(null);
					String securityUrl = AESUtil.parseByte2HexStr(AESUtil.enCrypt(urlParam, AppProp.get("app.securityKey")));
					
					StringBuilder sb = new StringBuilder();
					sb.append("亲爱的用户：<br>");
					sb.append("欢迎您使用").append(AppProp.get("app.siteName")).append("，请在五分钟内点击以下链接完成注册：<br>");
					sb.append(siteAddressPre + securityUrl + ".html").append("<br>");
					sb.append("如果您的邮箱不支持链接点击，请将其拷贝到浏览器地址栏中再进行访问<br>");
					sb.append("如果不是您的操作，请忽略！");
					mailInfo.setContent(sb.toString());
		
					MailUtil.sendEmail(mailInfo);
					
					result.setSuccess(true);
					result.setMsg("已向您填写的邮箱发送验证信息，请前往验证");
				} catch (Exception e) {
					result.setSuccess(false);
					result.setMsg("注册成功，邮件发送失败，请登录后再对此账号重新进行激活");
				}
			}
		} else {
			result.setSuccess(false);
			result.setMsg("请输入合法的邮箱地址");
		}
		return result;
	}

	/**
	 * 邮箱验证
	 * @author 何家明
	 * @date   2018年11月18日 上午12:30:36
	 * @param url
	 * @return
	 */
	@RequestMapping("/validateEmail/{url}")
	public String validateEmail(@PathVariable("url")String url, ModelMap map) {
		
		String urlParam = AESUtil.deCrypt(AESUtil.parseHexStr2Byte(url), AppProp.get("app.securityKey"));
		String[] params = urlParam.split("&");
		
		String email = params[0].split("=")[1];
		String validateTimeStr = params[1].split("=")[1];
		
		long validateTime = DateUtil.parse(validateTimeStr, null).getTime();
		long now = new Date().getTime();
		
		if(now - validateTime <= 5 * 60 * 1000) {  // 5分钟以内才可以进行验证
			UserVo user = userService.getByEmail(email);
			if(user != null) {  // 正常来说不可能有这种情况
				if("C".equals(user.getUserStatus())) {
					map.addAttribute("tips", "此邮箱已经验证通过了，请直接登录！");
					return "tips";
				} else {
					userService.validateEmail(email);  // 验证通过，跳转到登录页面
					return "redirect:/";
				}
			} else {
				map.addAttribute("tips", "你是傻逼吗，乱输个鸡巴的地址，自己去走正常流程！");
				return "tips";
			}
		} else {
			map.addAttribute("tips", "此链接已过期，请重新注册！");
			return "tips";
		}
	}
	
	/**
	 * 用户基本资料页面
	 * @auth 何家明
	 * @date 2018年11月19日 下午3:08:03
	 * @param id
	 * @return
	 */
	@RequestMapping("/detail/{id}")
	public String detail(@PathVariable(value = "id", required = false) String id, HttpServletRequest request, ModelMap map) {
		UserVo user = SessionUtil.getUser(request);
		if(StringUtils.isNotBlank(id) && !StringUtils.equals(id, user.getId())) {  // 如果不是当前用户，就去从数据库里面查
			user = userService.getById(id);
		}
		map.put("userVo", user);
		return "admin/sys/user/detail";
	}
	/**
	 * 用户基本资料页面
	 * @auth 何家明
	 * @date 2018年11月19日 下午3:08:03
	 * @return
	 */
	@RequestMapping("/detail")
	public String detail(HttpServletRequest request, ModelMap map) {
		return detail(null, request, map);
	}
	
	/**
	 * 更新用户信息
	 * @auth ex-hejm
	 * @date 2018年11月20日 下午4:39:40
	 * @param user
	 * @param request
	 * @param map
	 * @return
	 */
	@RequestMapping("/update")
	public String update(UserVo user, HttpServletRequest request, ModelMap map) {
		userService.update(user);
		
		SessionUtil.update(request, "user", user);
		
		map.put("userVo", user);
		return "admin/sys/user/detail";
	}
	
	/**
	 * 修改密码页面
	 * @auth 何家明
	 * @date 2018年11月19日 下午3:08:03
	 * @return
	 */
	@RequestMapping("/password")
	public String password(HttpServletRequest request, ModelMap map) {
		return "admin/sys/user/password";
	}
	
	/**
	 * 退出
	 * @auth ex-hejm
	 * @date 2018年11月20日 下午4:55:47
	 * @param request
	 * @return
	 */
	@RequestMapping("/logout")
	public String logout(HttpServletRequest request) {
		SessionUtil.remove(request, "user");
		return "redirect:/";
	}
	
	/**
	 * 修改密码
	 * @auth ex-hejm
	 * @date 2018年11月21日 上午10:16:17
	 * @param id
	 * @param password
	 * @param newPassword
	 * @return
	 */
	@RequestMapping("/modifyPassword")
	public String modifyPassword(@RequestParam("id") String id, @RequestParam("password") String password, @RequestParam("newPassword") String newPassword, ModelMap map) {
		UserVo userVo = userService.getById(id);
		if(userVo != null) {
			String encryPassword = AESUtil.parseByte2HexStr(AESUtil.enCrypt(password, userVo.getSecurityKey()));
			if(!StringUtils.equals(encryPassword, userVo.getPassword())) {  // 旧密码与原密码不一致
				map.put("exception", "旧密码与当前密码不一致");
			} else {
				// 对新密码进行加密
				String securityKey = AESUtil.parseByte2HexStr(AESUtil.enCrypt(userVo.getEmail() + newPassword, AppProp.get("app.securityKey")));
				String newDbPassword = AESUtil.parseByte2HexStr(AESUtil.enCrypt(newPassword, securityKey));
				userService.modifyPassword(id, newDbPassword, securityKey);
				map.put("success", "修改成功");
			}
		} else {
			map.put("exception", "用户不存在，请重新登录");
		}
		return "admin/sys/user/password";
	} 
}
